import { ref } from 'vue';
import axios, { InternalAxiosRequestConfig, AxiosResponse } from "axios";
import { ElMessage,ElMessageBox } from "element-plus";

import { useRouter } from "vue-router";
const router = useRouter();

// 创建axios实例
const service = axios.create({
    // baseURL: process.env.BASE_URL,
    baseURL: '/api/',
    // timeout: 30000, // 请求超时时间
    headers: { "Content-Type": "application/json;charset=utf-8" },
});


let failureTime;
const loginStatus = ref(true);
// 请求拦截器
service.interceptors.request.use(
    (config: InternalAxiosRequestConfig) => {
        
        // // 在请求拦截器里面 统一添加 取消请求 强行中断请求要用到的，记录请求信息
        // const CancelToken = axios.CancelToken;
        // config['cancelToken'] = new CancelToken(function executor(cancel) {
        //     Vue.$httpRequestList.push(cancel) //存储cancle
        // })
        // 请求头添加token
        config.headers['Access-control-allow-headers'] = sessionStorage.getItem('zkAdmin_pro_tokenv3') ? sessionStorage.getItem('zkAdmin_pro_tokenv3') : '';

        console.log(process.env.NODE_ENV)
        if(config.isSid){//判断是否需要携带sid
            config.headers['sid'] = 'a';
            if(process.env.NODE_ENV !== 'development'){
                if(config.isLoginInvalidation){//判断是否需要判断登录失效
                    let tokenFailureTime = sessionStorage.getItem('tokenFailureTime') ? sessionStorage.getItem('tokenFailureTime') : 0;
                    if(Number(tokenFailureTime) <= 0 && loginStatus.value){ //如果失效时间小于等于0的时候
                        loginStatus.value = false;
                        router.push('/login');
                        ElMessage.error("登录已失效，请重新登录");
                        // 执行退出登录
                        let timeout = setTimeout(() => {
                            loginStatus.value = true;
                            sessionStorage.clear()
                            clearTimeout(timeout);
                        }, 1500)
                    }
                }

                // 首页控制台因可能需查多数据源数据，所以sid变化
                if(config.url.indexOf('Index/DataStatistics') > -1 || config.url.indexOf('Index/DataDistribution') > -1){
                    config.headers['sid'] = 'mix'
                }else{

                }
            }
        }

        // 导出时添加请求头
        if(config.responseType == 'blob'){
            let sid = config.headers['sid'];
            if(sid == 'b' || sid == 'c' || sid == 'd' || sid == 'isv-a'){
                config.headers['action'] = `export-${sid}`
            }else{
                config.headers['action'] = 'export'
            }
        }
        
        console.log(config)
        return config;
    },
    (error:any) => {
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    (response: AxiosResponse) => {
        const { code, message } = response.data;
        // 接口执行成功后，重置登录失效时间
        sessionStorage.setItem('tokenFailureTime', 120 * 60);
        clearInterval(failureTime);
        failureTime = setInterval(() => {
            let tokenFailureTime = sessionStorage.getItem('tokenFailureTime');
            if(tokenFailureTime <= 0){
                clearInterval(failureTime);
            }
            sessionStorage.setItem('tokenFailureTime', tokenFailureTime - 1)
        },1000)

        if(code == 200){
            return response.data;
        }

        // // 响应数据为二进制流处理(Excel导出)
        // if (response.data instanceof ArrayBuffer) {
        //     return response;
        // }

        // ElMessage.error(message || "系统出错");
        return Promise.reject(new Error(message || "Error"));
    },
    (error: any) => {
        // if(error.message === 'interrupt') {
        //     // console.log('请求中断');
        //     return new Promise(() => {});
        // }
        if (error.response.data) {
            const { status, message } = error.response.data;
            // token 过期,重新登录
            if (status == 400) {
                ElMessage.error(message || "请求的数据格式不符!");
            } else if(status == 401) {
                ElMessage.error(message || "服务器未响应, 请联系管理员!");
            } else {
                ElMessage.error(message || "异常问题, 请联系管理员! ");
            }
        }
        return Promise.reject(error.message);
    }
)

// 导出 axios 实例
export default service;